﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace KATAJAVI_SIA
{
    public partial class EditarMotos : Form
    {
        KATAJAVI call = new KATAJAVI();
        DataClassesDataContext BEDE = new DataClassesDataContext();
        IEnumerable<MOTO> lista1;
        IEnumerable<ATENCION> lista2;
        IEnumerable<CLIENTE> lista3;
        int valmarca, valcolor, valmod, valrut, valdueno;
        

        public EditarMotos()
        {
            InitializeComponent();
        }

        public void NoVacios()
        {
            if (dgv_MotosLista.RowCount == 0)
            {
                btn_CargarRegistro.Enabled = false;
                btn_EliminarRegistro.Enabled = false;
                btn_BuscarCliente.Enabled = false;
                tbx_BusquedaDato.Enabled = false;
            }
        }

        private void Limpiar()
        {
            tbx_MotoPatente.Clear();
            tbx_BusquedaDato.Clear();
            tbx_MotoRutDueno.Clear();
            tbx_MotoRutDigDueno.Clear();
            tbx_MotoModelo.Clear();
            cbx_MotoColor.SelectedIndex = -1;
            cbx_MotoMarca.SelectedIndex = -1;
            tbx_MotoModelo.Enabled = false;
            tbx_MotoPatente.Enabled = false;
            tbx_MotoRutDueno.Enabled = false;
            tbx_MotoRutDigDueno.Enabled = false;
            cbx_MotoColor.Enabled = false;
            cbx_MotoMarca.Enabled = false;
            tbx_MotoNombreDueno.Clear();
            tbx_MotoNombreDueno.Enabled = false;
        }

        private void LlenarMotos()
        {
            lista1 = BEDE.MOTO.Where(a => a.softdelete == 1);
            foreach (MOTO aux in lista1)
            {
                CLIENTE owner = BEDE.CLIENTE.Where(a => a.rut_cliente == aux.rut_cliente).First();
                MARCA_MOTO mark = BEDE.MARCA_MOTO.Where(b => b.id_marca == aux.id_marca).First();
                string estado = "";
                int j = 0;
                lista2 = BEDE.ATENCION.OrderBy(a => a.cod_atencion);
                foreach (ATENCION aux2 in lista2)
                {
                    if (aux2.id_motocicleta == aux.id_motocicleta)
                    {
                        estado = aux2.ESTADO_ATENCION1.NombreEstado.ToString();
                        j++;
                    }
                }
                if (j == 0) { estado = "SIN ATENCIONES"; }
                dgv_MotosLista.Rows.Add(aux.patente, owner.nombre, mark.Nombre, estado);
            }
            btn_CargarRegistro.Enabled = true;
            btn_EliminarRegistro.Enabled = true;
        }

        private int FiltrarGrid(string buscado)
        {
            dgv_MotosLista.Rows.Clear();
            lista1 = BEDE.MOTO.Where(a => a.softdelete == 1);
            int aa = 0;
            foreach (MOTO aux in lista1)
            {
                if (aux.patente.ToString().Contains(buscado) | aux.CLIENTE.nombre.Contains(buscado) | aux.MARCA_MOTO.Nombre.Contains(buscado))
                {
                    CLIENTE owner = BEDE.CLIENTE.Where(a => a.rut_cliente == aux.rut_cliente).First();
                    MARCA_MOTO mark = BEDE.MARCA_MOTO.Where(b => b.id_marca == aux.id_marca).First();
                    string estado = "";
                    int j = 0;
                    lista2 = BEDE.ATENCION.OrderBy(a => a.cod_atencion);
                    foreach (ATENCION aux2 in lista2)
                    {
                        if (aux2.id_motocicleta == aux.id_motocicleta)
                        {
                            estado = aux2.ESTADO_ATENCION1.NombreEstado.ToString();
                            j++;
                        }
                    }
                    if (j == 0) { estado = "SIN ATENCIONES"; }
                    dgv_MotosLista.Rows.Add(aux.patente, owner.nombre, mark.Nombre, estado);
                    aa++;
                }
            }
            if (aa == 0) { return 0; }
            else { return 1; }
        }

        private void EditarMotos_Load(object sender, EventArgs e)
        {
            LlenarMotos();
            cbx_MotoMarca.DataSource = BEDE.MARCA_MOTO.Where( a => a.id_marca != 0);
            cbx_MotoMarca.ValueMember = "id_marca";
            cbx_MotoMarca.DisplayMember = "Nombre";
            cbx_MotoColor.SelectedIndex = -1;
            cbx_MotoMarca.SelectedIndex = -1;
            NoVacios();
        }

        private void btn_EliminarRegistro_Click(object sender, EventArgs e)
        {
            lista1 = BEDE.MOTO;
            int idmoto = call.GenIDMoto(dgv_MotosLista.CurrentRow.Cells[0].Value.ToString());
            int permiso = call.ValidarEliminacionMoto(idmoto.ToString());
            if (permiso == 0)
            {
                MessageBox.Show("La MOTOCICLETA seleccionada no se ha podido eliminar, porque el sistema aun registra ATENCIONES relacionadas. Si desea eliminar la MOTOCICLETA, es necesario que ésta no esté relacionada con ninguna ATENCIÓN registrada.", "ERROR AL INTENTAR ELIMINAR EL REGISTRO.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                foreach (MOTO aux in lista1)
                {
                    if (aux.id_motocicleta == idmoto)
                    {
                        if (MessageBox.Show("¿Esta seguro que desea eliminar el\nregistro seleccionado?.", "ELIMINAR UN REGISTRO", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                        {
                            aux.softdelete = 0;
                            BEDE.SubmitChanges();
                            Limpiar();
                            dgv_MotosLista.Rows.Clear();
                            LlenarMotos();
                            btn_GuardarCambios.Enabled = false;
                            btn_NoHacerCambios.Enabled = false;
                            MessageBox.Show("La motocicleta fue eliminada correctamente del sistema.", "REGISTRO ELIMINADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            NoVacios();
                        }
                    }
                }
            }
        }

        private void btn_CargarRegistro_Click(object sender, EventArgs e)
        {
            lista1 = BEDE.MOTO;
            int idmoto = call.GenIDMoto(dgv_MotosLista.CurrentRow.Cells[0].Value.ToString());
            foreach (MOTO aux in lista1)
            {
                if (aux.id_motocicleta == idmoto)
                {
                    tbx_MotoPatente.Text = aux.patente.Trim();
                    tbx_MotoRutDueno.Text = aux.rut_cliente.ToString().Trim();
                    tbx_MotoModelo.Text = aux.modelo.Trim();
                    cbx_MotoMarca.SelectedValue = aux.id_marca;
                    CLIENTE owner = BEDE.CLIENTE.Where(a => a.rut_cliente == aux.rut_cliente).First();
                    tbx_MotoNombreDueno.Text = owner.nombre.Trim();
                    btn_NoHacerCambios.Enabled = true;
                    btn_GuardarCambios.Enabled = true;
                    cbx_MotoColor.SelectedItem = aux.color;

                    int b = 0;
                    int id = call.GenIDMoto(aux.patente);
                    lista2 = BEDE.ATENCION;
                    foreach (ATENCION aux2 in lista2)
                    {
                        if (aux2.id_motocicleta == id)
                        {
                            b = 1;
                        }
                    }
                    if (b == 1) { tbx_MotoRutDueno.ReadOnly = true; tbx_MotoRutDigDueno.ReadOnly = true; }
                    if (b == 0) { tbx_MotoRutDueno.ReadOnly = false; tbx_MotoRutDigDueno.ReadOnly = false; }
                    if (tbx_MotoRutDueno.ReadOnly == true) { tbx_MotoRutDueno.BackColor = Color.WhiteSmoke; }
                    if (tbx_MotoRutDigDueno.ReadOnly == true) { tbx_MotoRutDigDueno.BackColor = Color.WhiteSmoke; }
                    
                }
            }
            tbx_BusquedaDato.Enabled = true;
            tbx_MotoModelo.Enabled = true;
            tbx_MotoPatente.Enabled = true;
            tbx_MotoRutDueno.Enabled = true;
            tbx_MotoRutDigDueno.Enabled = true;
            cbx_MotoColor.Enabled = true;
            cbx_MotoMarca.Enabled = true;
            tbx_MotoNombreDueno.Enabled = true;
        }

        private void btn_NoHacerCambios_Click(object sender, EventArgs e)
        {
            Limpiar();
            btn_GuardarCambios.Enabled = false;
            btn_NoHacerCambios.Enabled = false;
        }

        private void btn_BuscarCliente_Click(object sender, EventArgs e)
        {
            if (tbx_BusquedaDato.Text.Length >= 3)
            {
                tbx_BusquedaDato.Text = tbx_BusquedaDato.Text.Trim();
                int a = call.BuscarEnGrid(tbx_BusquedaDato.Text, dgv_MotosLista);
                if (a == 0)
                {
                    int b = FiltrarGrid(tbx_BusquedaDato.Text.Trim());
                    if (b == 0)
                    {
                        MessageBox.Show("No se encontro ningun usuario asociado al dato indicado.", "RESULTADO DE LA BUSQUEDA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        NoVacios();
                        tbx_BusquedaDato.Enabled = true;
                        btn_BuscarCliente.Enabled = true;
                    }
                    else { MessageBox.Show("No se encontró un resultado preciso. Se filtraron los registros, usando la cadena indicada como referencia.", "BUSQUEDA FILTRADA.", MessageBoxButtons.OK, MessageBoxIcon.Information); }
                }
            }
            else
            {
                if (tbx_BusquedaDato.Text == "") { errorProvider1.SetError(tbx_BusquedaDato, "Ingrese un dato para iniciar la búsqueda."); }
                else { errorProvider1.SetError(tbx_BusquedaDato, "El texto ingresado es muy corto para una búsqueda efectiva.\n(Se requieren mínimo 3 caracteres para la busqueda)."); }
            }
        }

        private void btn_GuardarCambios_Click(object sender, EventArgs e)
        {
            try
            {
                int idaux = call.GenIDMoto(tbx_MotoPatente.Text);
                MOTO MotoExistente = (from c in BEDE.MOTO where c.id_motocicleta == idaux select c).First();
                tbx_MotoNombreDueno.Focus();
                if (int.Parse(tbx_MotoRutDueno.Text) != MotoExistente.rut_cliente)
                {
                    tbx_MotoRutDueno.Focus();
                    tbx_MotoRutDigDueno.Focus();
                }
                cbx_MotoMarca.Focus();
                tbx_MotoModelo.Focus();
                cbx_MotoColor.Focus();
                btn_GuardarCambios.Focus();
                int sw = valmarca * valcolor * valmod;
                //SI LOS TEXTOS INGRESADOS SON INCORRECTOS
                if (sw == 0)
                {
                    MessageBox.Show("Los datos ingresados son erroneos,\n por favor revise los campos señalados.", "ERROR EN LOS DATOS INGRESADOS.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                if (sw == 1)
                {
                    if (int.Parse(tbx_MotoRutDueno.Text) == MotoExistente.rut_cliente)  // SI EL RUT DEL DUEÑO DE LA MOTO NO SE MODIFICÓ
                    {
                        if (MessageBox.Show("¿Esta seguro que desea guardar los cambios\nrealizados al registro?.", "EDITAR REGISTRO.", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                        {
                            MotoExistente.id_marca = int.Parse(cbx_MotoMarca.SelectedValue.ToString());
                            MotoExistente.modelo = tbx_MotoModelo.Text;
                            MotoExistente.color = cbx_MotoColor.SelectedItem.ToString();
                            BEDE.SubmitChanges();
                            Limpiar();
                            dgv_MotosLista.Rows.Clear();
                            LlenarMotos();
                            btn_GuardarCambios.Enabled = false;
                            btn_NoHacerCambios.Enabled = false;
                            MessageBox.Show("Los cambios realizados en el registro\nse guardaron exitosamente.", "REGISTRO EDITADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else  // SI EL RUT DEL DUEÑO DE LA MOTO SI SE MODIFICÓ
                    {
                        sw = sw * valrut;
                        if (sw == 0)
                        {
                            MessageBox.Show("Los datos ingresados son erroneos,\n por favor revise los campos señalados.", "ERROR EN LOS DATOS INGRESADOS.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else
                        {
                            if (valdueno == 1) // SI EL RUT QUE SE DESEA MODIFICAR EXISTE
                            {
                                if (MessageBox.Show("¿Esta seguro que desea guardar los cambios\nrealizados al registro?.", "EDITAR REGISTRO.", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                                {
                                    MotoExistente.rut_cliente = int.Parse(tbx_MotoRutDueno.Text);
                                    MotoExistente.id_marca = int.Parse(cbx_MotoMarca.SelectedValue.ToString());
                                    MotoExistente.modelo = tbx_MotoModelo.Text;
                                    MotoExistente.color = cbx_MotoColor.SelectedItem.ToString();
                                    BEDE.SubmitChanges();
                                    Limpiar();
                                    dgv_MotosLista.Rows.Clear();
                                    LlenarMotos();
                                    btn_GuardarCambios.Enabled = false;
                                    btn_NoHacerCambios.Enabled = false;
                                    MessageBox.Show("Los cambios realizados en el registro\nse guardaron exitosamente.", "REGISTRO EDITADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                            }
                        }
                    }
                }
            }
            catch { MessageBox.Show("Ha ocurrido un error al intentar guardar la inforación\n de la motociclera. Por favor, revise los datos e intentelo nuevamente.\n De Persistir el error, se recomienda reiniciar el programa.", "ERROR AL INTENTAR GUARDAR.", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void tbx_PatenteBuscar_TextChanged(object sender, EventArgs e)
        {
            if (tbx_BusquedaDato.Text.Length >= 3) { errorProvider1.Clear(); }
            if (tbx_BusquedaDato.Text == "")
            {
                dgv_MotosLista.Rows.Clear();
                LlenarMotos();
            }
        }

        private void tbx_MotoRutDueno_TextChanged(object sender, EventArgs e)
        {
            tbx_MotoRutDueno.Text = tbx_MotoRutDueno.Text.Trim();
        }

        private void cbx_MotoMarca_Leave(object sender, EventArgs e)
        {
            valmarca = call.ValidarCombobox(cbx_MotoMarca.Text);
            if (valmarca == 0) { errorProvider1.SetError(cbx_MotoMarca, "* Debe seleccionar alguna MARCA para la motocicleta."); }
            else { errorProvider1.SetError(cbx_MotoMarca, ""); }
        }

        private void cbx_MotoColor_Leave(object sender, EventArgs e)
        {
            valcolor = call.ValidarCombobox(cbx_MotoColor.Text);
            if (valcolor == 0) { errorProvider1.SetError(cbx_MotoColor, "* Debe seleccionar algun color para la motocicleta."); }
            else { errorProvider1.SetError(cbx_MotoColor, ""); }
        }

        private void tbx_MotoModelo_Leave(object sender, EventArgs e)
        {
            tbx_MotoModelo.Text = tbx_MotoModelo.Text.Trim();
            if (tbx_MotoModelo.Text == "") { valmod = 0; } else { valmod = 1; }
            if (valmod == 0) { errorProvider1.SetError(tbx_MotoModelo, "* Este campo no puede quedar vacío."); }
            else { errorProvider1.SetError(tbx_MotoModelo, ""); }
        }

        private void tbx_MotoRutDigDueno_Leave(object sender, EventArgs e)
        {
            tbx_MotoNombreDueno.Clear();
            errorProvider1.SetError(tbx_MotoNombreDueno, "");
            valrut = call.ValidarRut(tbx_MotoRutDueno.Text, tbx_MotoRutDigDueno.Text);
            if (valrut == 0) { errorProvider1.SetError(tbx_MotoRutDigDueno, "* El RUT no coincide con su digito verificador.\n* El número de RUT solo puede contener caracteres entre 0 y 9.\n* El Digito Verificador solo admite caracteres entre 0 y 9 ademas de la letra K.\n* Ninguno de los campos puede quedar vacíos."); }
            else
            {
                valdueno = call.ComprobarDueño(tbx_MotoRutDueno.Text, "");
                if (valdueno == 0) { errorProvider1.SetError(tbx_MotoRutDigDueno, "Ha ocurrido un error de registros.\n El RUT del dueño al que intenta asociar la motocicleta\nno se encuentra en la base de datos.\nPor favor, sirvase registrar al dueño del vehículo antes de\registrar la motocicleta."); }
                else
                {
                    lista3 = BEDE.CLIENTE;
                    foreach (CLIENTE aux in lista3)
                    {
                        if (aux.rut_cliente == int.Parse(tbx_MotoRutDueno.Text.ToString()))
                        {
                            tbx_MotoNombreDueno.Text = aux.nombre;
                            errorProvider1.SetError(tbx_MotoRutDigDueno, "");
                        }
                    }
                }
            }
        }

        private void tbx_MotoRutDueno_TextChanged_1(object sender, EventArgs e)
        {
            tbx_MotoRutDigDueno.Clear();
            tbx_MotoRutDueno.Text = tbx_MotoRutDueno.Text.Trim();
        }

        private void tbx_MotoNombreDueno_Leave(object sender, EventArgs e)
        {

        }
    }
}

       
